package network2;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp = null;
    private int serverPort  = 0;
    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        /*一次通信，需要有两个IP和两个端口，客户端的ip 是127.0.0.1是已知的
        * 客户端的端口号是由系统自动分配的，服务器的IP和端口号也要告诉客户端，
        * 此时才能顺利的给服务器发送消息*/
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }
    public void start() throws IOException {
        System.out.println("客户端启动：");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            //1.从控制台读取要发送的数据
            System.out.print("> ");
            String request = scanner.next();
            if (request.equals("exit")) {
                System.out.println("goodbye");
                break;
            }
            //2.构造成UDP请求
            //构造这个 Packet 的时候，需要把serverIp 和 port 都传入过来，但是此处ip地址需要填写的是一个32位的整数
            // 上述的IP地址是一个字符串，需要使用InetAddress.getByName()方法来进行一个转换
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length, InetAddress.getByName(serverIp), serverPort);
            socket.send(requestPacket);
            //3.读取服务器的UDP的响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(responsePacket);
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
            //4.把解析好的结果显示出来
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);
        client.start();
    }
}
/*端口号用来标识/区分一个进程，因此不允许一个端口同时被多个进程使用，（前提是同一个主机上）
* 通常情况下，一个进程可以绑定多个端口，进程只要创建多个socket对象，就可以分别关联到不同的端口，
* （准确的说，socket和端口是一对一的，进程和socket是一对多的）
* */
/*这里的服务器的端口号是不会冲突的，程序猿是可以看到自己的电脑上，哪个端口是空闲的（可以通过一些系统的命令）*/